/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.optimus.app;

import com.optimus.bo.ElementoPublicitarioBO;
import com.optimus.bo.RutaOptimaBO;
import com.optimus.bo.impl.ElementoPublicitarioBOImpl;
import com.optimus.bo.impl.RutaOptimaBOImpl;
import com.optimus.common.cvo.ElementoPublicitarioCVOList;
import com.optimus.common.util.ApplicationException;
import com.optimus.common.util.ConstantesDB;
import com.optimus.common.vo.BaseVO;
import com.optimus.common.vo.CampanaVO;
import com.optimus.common.vo.EPCampanaVO;
import com.optimus.common.vo.MercadoVO;
import com.optimus.common.vo.ResultadoVO;
import java.util.HashMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 *
 * @author vperez
 */
public class ThreadWorkerRutaOptima extends ThreadWorker {

    private static Logger logger = LoggerFactory.getLogger(ThreadWorkerRutaOptima.class);
    private static ThreadWorkerRutaOptima i=null;
    private ThreadWorkerRutaOptima(){
        i=this;
        setEstaEjecutando(Boolean.FALSE);//FIXME
        setParametros(new HashMap<String, Object>());
        setResultados(new HashMap<String, Object>());
    }
    public static ThreadWorkerRutaOptima instance(){
        return i!=null?i:new ThreadWorkerRutaOptima();
    }
    @Override
    public void ejecutar() throws ApplicationException {
        setEstaEjecutando(Boolean.TRUE);
        start();
    }
    
    @Override
    public void run(){

        HashMap<String,Object> resultado=new HashMap<String,Object>();
        Integer idCampanaRecoleccion = 0;
        Integer idMercado = 0;
        Long tk = 0L;
        ElementoPublicitarioCVOList epvo = new ElementoPublicitarioCVOList();
        try {
            if(getParametros().containsKey("idCampanaRecoleccion")){
                if(getParametros().get("idCampanaRecoleccion") instanceof Integer){
                    idCampanaRecoleccion=(Integer)getParametros().get("idCampanaRecoleccion");
                }
            }
            if(getParametros().containsKey("idMercado")){
                if(getParametros().get("idMercado") instanceof Integer){
                    idMercado = (Integer)getParametros().get("idMercado");
                }
            }
            if(getParametros().containsKey("ticket")){
                if(getParametros().get("ticket") instanceof Long){
                    tk = (Long)getParametros().get("ticket");
                }
            }
            if(getParametros().containsKey("datos")){
                if(getParametros().get("datos") instanceof ElementoPublicitarioCVOList){
                    epvo = (ElementoPublicitarioCVOList)getParametros().get("datos");
                }
            }



            RutaOptimaBO rutaOptimaBO = new RutaOptimaBOImpl();
            CampanaVO campanaVO = new CampanaVO();
            campanaVO.setIdCampanaRecoleccion(idCampanaRecoleccion);
            campanaVO.setTicket(tk);
            MercadoVO mercadoVO = new MercadoVO();
            mercadoVO.setIdMercado(idMercado);
            mercadoVO.setTicket(tk);
            BaseVO result = rutaOptimaBO.calcularRutaOptima(campanaVO, mercadoVO,epvo);
            resultado.put("codigo", result.getCodigo().toString());
            resultado.put("ticket", result.getTicket().toString());
            if(result.getCodigo()==ConstantesDB.STATUS_FAIL){
                throw new ApplicationException("No se ejecutado correctamente");
            }
            //Despues de calcular distancias obtenemos el orden de los puntos y lo seteamos en la lista
            ElementoPublicitarioBO elementoPublicitarioBO=new ElementoPublicitarioBOImpl();
            //calcularRutaOptima
            //BaseVO resultado= rutaOptimaBO1.calcularRutaOptima(campanaVO, mercadoVO, epvo);
            logger.debug("Eliminando datos anteriores");
            EPCampanaVO ePCampanaVO = new EPCampanaVO();
            ePCampanaVO.setIdCampanaRecoleccion(idCampanaRecoleccion);
            ePCampanaVO.setTicket(campanaVO.getTicket());
            elementoPublicitarioBO.eliminar(ePCampanaVO);
            logger.debug("Guardando ruta optima");
            ResultadoVO resultadoVO=elementoPublicitarioBO.generarRutaOptima(epvo,campanaVO);
            logger.debug("Guardado con exito");
            setResultados(resultado);
        } catch (ApplicationException ex) {
            logger.debug("Ruta Optima no se ha ejecutado correctamente", ex);
        } finally {
            setEstaEjecutando(Boolean.FALSE);//FIXME
        }
    }
}
